package u2

import (
	cr "crypto/rand"
	"encoding/hex"
	"io"
	"math/rand"
)

// RandSeq 生成指定长度的随机字符串，包含数字和大小写字母
//
// 参数：
//
//	n - 要生成的字符串长度
//
// 返回值：
//
//	string - 生成的随机字符串
//
// 注意：
//  1. 使用math/rand包生成随机数，需确保已调用rand.Seed()
//  2. 生成的字符串包含以下字符集：
//     "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
//
// 示例：
//
//	rand.Seed(time.Now().UnixNano())
//	randomStr := RandSeq(10) // 生成10位随机字符串
func RandSeq(n int) string {
	letters := []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
	b := make([]rune, n)
	for i := range b {
		b[i] = letters[rand.Intn(len(letters))]
	}
	return string(b)
}

// UUID 生成符合RFC 4122标准的版本4 UUID
//
// 返回值：
//
//	string - 生成的UUID字符串，格式为"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
//
// 注意：
//  1. 使用crypto/rand包生成安全的随机数
//  2. 符合UUID版本4规范：
//     - 第13位设置为'4'表示版本4
//     - 第17位设置为'8'、'9'、'a'或'b'表示变体
//  3. 生成的UUID是随机的，不是基于时间或MAC地址的
//
// 示例：
//
//	id := UUID() // 生成类似"f47ac10b-58cc-4372-a567-0e02b2c3d479"的UUID
func UUID() string {
	var uuid [16]byte
	io.ReadFull(cr.Reader, uuid[:])
	uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4
	uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10
	var dsti [36]byte
	dst := dsti[:]
	hex.Encode(dst, uuid[:4])
	dst[8] = '-'
	hex.Encode(dst[9:13], uuid[4:6])
	dst[13] = '-'
	hex.Encode(dst[14:18], uuid[6:8])
	dst[18] = '-'
	hex.Encode(dst[19:23], uuid[8:10])
	dst[23] = '-'
	hex.Encode(dst[24:], uuid[10:])
	return string(dst[:])
}
